/*************************************************************************
    > File Name: slave4.c
    > Author: wusihai
    > Mail: wusihai18@gmail.com 
    > Created Time: Fri 21 Feb 2020 10:58:06 PM CST
 ************************************************************************/
#include <stdio.h>
#include "slavertm.h"

#include <slave.h>
#include <math.h>
#include "register.h"
#include <simd.h>

#define L1   1 
#define L2   8
#define L3   48
#define MAXD 48

//索引宏
#define n3d_ext(ix,iy,iz)   ix*SubNy*SubNz+iy*SubNz+iz
#define n3d(ix,iy,iz)       ix*DivNy*DivNz+iy*DivNz+iz
//计算PML衰减参数
float pmlx_cal(int g_x,int PMLX,int mgridnumx,float Vpmax,float dh){
  float ddx = 0.0f;
  float R = 0.000001f;//理想边界反射系数
  if(g_x<PMLX){
	ddx= 3 * Vpmax / 2 / PMLX / dh*log(1.0f / R)*(PMLX - g_x) / PMLX*(PMLX - g_x) / PMLX;//上边吸收
  }
  else if(g_x >= (mgridnumx+2*PMLX) - PMLX){
	ddx = 3 * Vpmax / 2 / PMLX /dh*log(1.0f / R)*(g_x - PMLX - mgridnumx+1) / PMLX*(g_x - PMLX- mgridnumx+1) / PMLX;
  }
  return ddx;
}
float pmly_cal(int g_y,int PMLY,int mgridnumy,float Vpmax,float dh){
  float ddy = 0.0f;
  float R = 0.000001f;//理想边界反射系数
  if(g_y<PMLY){
	ddy= 3 * Vpmax / 2 / PMLY / dh*log(1.0f / R)*(PMLY - g_y) / PMLY*(PMLY - g_y) / PMLY;//上边吸收
  }
  else if(g_y >= (mgridnumy+2*PMLY) - PMLY){
	ddy = 3 * Vpmax / 2 / PMLY /dh*log(1.0f / R)*(g_y - PMLY - mgridnumy+1) / PMLY*(g_y - PMLY- mgridnumy+1) / PMLY;
  }
  return ddy;
}
float pmlz_cal(int g_z,int PMLZ,int mgridnumz,float Vpmax,float dh){
  float ddz = 0.0f;
  float R = 0.000001f;//理想边界反射系数
  if(g_z<PMLZ){
	ddz= 3 * Vpmax / 2 / PMLZ / dh*log(1.0f / R)*(PMLZ - g_z) / PMLZ*(PMLZ - g_z) / PMLZ;//上边吸收
  }
  else if(g_z >= mgridnumz+PMLZ){
	ddz = 3 * Vpmax / 2 / PMLZ /dh*log(1.0f / R)*(g_z - PMLZ - mgridnumz+1) / PMLZ*(g_z - PMLZ- mgridnumz+1) / PMLZ;
  }
  return ddz;
}

void Supdate_VelX(rtm_slave_parameter* p){
  int xx=L1;
  int yy=L2;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}
void Supdate_VelY(rtm_slave_parameter* p){
  int xx=L2;
  int yy=L1;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}
void Supdate_VelZ(rtm_slave_parameter* p){
  int xx=8;
  int yy=8;
  int zz=5;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}

void Supdate_TX(rtm_slave_parameter* p){
  int xx=L1;
  int yy=L2;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //切换
  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;

		  if(par.Vpconst==0){
			/* 0. load velocity model*/
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx-5;
				y=par.stY+gy+ty-5;
				z=par.stZ+gz-5;
				athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));
		  }
		  else{
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				for(tz=0;tz<ZZ;tz++){
				  vel[tx][ty][tz]=par.Vpconst;
				}
			  }
			}
		  }
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}

void Supdate_TY(rtm_slave_parameter* p){
  int xx=L2;
  int yy=L1;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //切换
  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;

		  if(par.Vpconst==0){
			/* 0. load velocity model*/
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx-5;
				y=par.stY+gy+ty-5;
				z=par.stZ+gz-5;
				athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));
		  }
		  else{
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				for(tz=0;tz<ZZ;tz++){
				  vel[tx][ty][tz]=par.Vpconst;
				}
			  }
			}
		  }
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}
void Supdate_TZ(rtm_slave_parameter* p){
  int xx=8;
  int yy=8;
  int zz=5;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //切换
  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;

		  if(par.Vpconst==0){
			/* 0. load velocity model*/
			get_reply=0;
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				x=par.stX+gx+tx-5;
				y=par.stY+gy+ty-5;
				z=par.stZ+gz-5;
				athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			  }
			}
			while(get_reply!=(XX*YY));
		  }
		  else{
			for(tx=0;tx<XX;tx++){
			  for(ty=0;ty<YY;ty++){
				for(tz=0;tz<ZZ;tz++){
				  vel[tx][ty][tz]=par.Vpconst;
				}
			  }
			}
		  }
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]+par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]+par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                            
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]+par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}




void Supdate_Vel_backX(rtm_slave_parameter* p){
  int xx=L1;
  int yy=L2;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}
void Supdate_Vel_backY(rtm_slave_parameter* p){
  int xx=L2;
  int yy=L1;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}
void Supdate_Vel_backZ(rtm_slave_parameter* p){
  int xx=4;
  int yy=4;
  int zz=5;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float Outtmp[xx][yy][zz];


  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;
	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PT+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt/par.rho*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt/par.rho*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n+1][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt/par.rho*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PVz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }

	}
  }
}


void Supdate_T_backX(rtm_slave_parameter* p){
  int xx=L1;
  int yy=L2;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 0. load velocity model*/
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}

void Supdate_T_backY(rtm_slave_parameter* p){
  int xx=L2;
  int yy=L1;
  int zz=L3;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 0. load velocity model*/
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}

void Supdate_T_backZ(rtm_slave_parameter* p){
  int xx=4;
  int yy=4;
  int zz=5;
  //10阶差分系数
  float StaCoef[5]={1.211242676,-0.089721680,0.013842773, -0.001765660, 0.000118679};//10阶
  //答应字
  volatile unsigned int get_reply,put_reply;
  //本地
  rtm_slave_parameter par;
  get_reply=0;
  athread_get(PE_MODE,p,&par,sizeof(rtm_slave_parameter),&get_reply,0,0,0);
  while(get_reply!=1);

  //获取当前从核号，行号，列号
  volatile unsigned int myid=athread_get_id(-1);
  volatile unsigned int rowid,colid;
  GET_ROW(rowid);
  GET_COL(colid);

  int SubNx=par.SubNx;
  int SubNy=par.SubNy;
  int SubNz=par.SubNz;
  int DivNx=par.DivNx;
  int DivNy=par.DivNy;
  int DivNz=par.DivNz;

  //LDM数据存储
  float  In[xx+10][yy+10][zz+10];
  float Out[xx][yy][zz];
  float vel[xx][yy][zz];

  float InTran[MAXD+10][4];
  float OutTran[MAXD][4];
  floatv4 v4In[10],v4Out;
  int i,n;


  //CG x-y loop
  int GridLoopX=(par.endX-par.stX+xx*8-1)/(8*xx);
  int GridLoopY=(par.endY-par.stY+yy*8-1)/(8*yy);
  //depth z loop
  int LoopZ=(par.endZ-par.stZ+zz-1)/(zz);

  int ix,iy,iz;
  int tx,ty,tz;
  int XX,YY,ZZ,l;
  int gx,gy,gz;
  int g_x,g_y,g_z;
  int x,y,z;
  float ddx=0.0f,ddy=0.0f,ddz=0.0f,temp;

  //从核- X-Y方向 循环反转
  int LX,LY,LZ=0;
  for(ix=0;ix<GridLoopX;ix++){
	gx=ix*8*xx+colid*xx;
	for(iy=0;iy<GridLoopY;iy++){
	  gy=iy*8*yy+rowid*yy;

	  if(gx<(par.endX-par.stX)&&gy<(par.endY-par.stY)){
		//重新确定X-Y计算范围-针对最边缘的CPE.
		((par.endX-par.stX)-gx)>xx?(XX=xx):(XX=((par.endX-par.stX)-gx));
		((par.endY-par.stY)-gy)>yy?(YY=yy):(YY=((par.endY-par.stY)-gy));

		LZ=0;
		//CPE block循环
		for(iz=0;iz<LoopZ;iz++){
		  //重新确定Z的计算范围
		  (par.endZ-par.stZ)-(iz*zz)>zz?(ZZ=zz):(ZZ=(par.endZ-par.stZ)-(iz*zz));
		  gz=iz*zz;
		  LZ=LZ+ZZ;
		  /* 0. load velocity model*/
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.Pvel+n3d(x,y,z),&vel[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVx+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));

		  /* 2. Load  Out1 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTxx+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(YY*ZZ);i+=4){
			//load一个X条
			for(tx=0;tx<XX+10;tx++){
			  ty=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[tx][0]=In[tx][ty+5][tz+5];
			  ty=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[tx][1]=In[tx][ty+5][tz+5];
			  ty=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[tx][2]=In[tx][ty+5][tz+5];
			  ty=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[tx][3]=In[tx][ty+5][tz+5];
			}

			//更新该条
			for(tx=0;tx<XX;tx++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tx+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tx][0]);
			}
			for(tx=5;tx<XX+5;tx++){
			  g_x=par.x_rank*par.DivNx+gx+tx+par.stX-10;
			  ddx=pmlx_cal(g_x,par.PMLX,par.mgridnumx,par.Vpmax,par.dh);
			  if((i+0)<(YY*ZZ)) {
				ty=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][0])/par.dh);
			  }
			  if((i+1)<(YY*ZZ)){ ty=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][1])/par.dh);
			  }
			  if((i+2)<(YY*ZZ)) {
				ty=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][2])/par.dh);
			  }
			  if((i+3)<(YY*ZZ)){ 
				ty=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx-5][ty][tz]=1.0f/(1.0f+0.5f*par.dt*ddx)*((1.0f-0.5f*par.dt*ddx)*Out[tx-5][ty][tz]-par.dt*(vel[tx-5][ty][tz]*vel[tx-5][ty][tz])*(OutTran[tx-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out1 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTxx+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVy+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out2 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTyy+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));
		  /* 3. compuation */
		  for(i=0;i<(XX*ZZ);i+=4){
			//load一个X条
			for(ty=0;ty<YY+10;ty++){
			  tx=(i+0)/ZZ;tz=(i+0)%ZZ;	InTran[ty][0]=In[tx+5][ty][tz+5];
			  tx=(i+1)/ZZ;tz=(i+1)%ZZ;	InTran[ty][1]=In[tx+5][ty][tz+5];
			  tx=(i+2)/ZZ;tz=(i+2)%ZZ;	InTran[ty][2]=In[tx+5][ty][tz+5];
			  tx=(i+3)/ZZ;tz=(i+3)%ZZ;	InTran[ty][3]=In[tx+5][ty][tz+5];
			}
			//更新该条
			for(ty=0;ty<YY;ty++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[ty+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[ty][0]);
			}
			for(ty=5;ty<YY+5;ty++){
			  g_y=par.y_rank*par.DivNy+gy+ty+par.stY-10;
			  ddy=pmly_cal(g_y,par.PMLY,par.mgridnumy,par.Vpmax,par.dh);
			  if((i+0)<(XX*ZZ)) {
				tx=(i+0)/ZZ;tz=(i+0)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][0])/par.dh);
			  }
			  if((i+1)<(XX*ZZ)){ 
				tx=(i+1)/ZZ;tz=(i+1)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][1])/par.dh);
			  }
			  if((i+2)<(XX*ZZ)) {
				tx=(i+2)/ZZ;tz=(i+2)%ZZ;	
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][2])/par.dh);
			  }
			  if((i+3)<(XX*ZZ)){ 
				tx=(i+3)/ZZ;tz=(i+3)%ZZ;
				Out[tx][ty-5][tz]=1.0f/(1.0f+0.5f*par.dt*ddy)*((1.0f-0.5f*par.dt*ddy)*Out[tx][ty-5][tz]-par.dt*(vel[tx][ty-5][tz]*vel[tx][ty-5][tz])*(OutTran[ty-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTyy+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));

		  /* 1. Load  In data */
		  get_reply=0;
		  for(tx=0;tx<XX+10;tx++){
			for(ty=0;ty<YY+10;ty++){
			  x=par.stX+gx+tx-5;
			  y=par.stY+gy+ty-5;
			  z=par.stZ+gz-5;
			  athread_get(PE_MODE,par.PVz+n3d_ext(x,y,z),
				  &In[tx][ty][0],sizeof(float)*(ZZ+10),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=((XX+10)*(YY+10)));


		  /* 2. Load  Out3 data */
		  get_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_get(PE_MODE,par.PTzz+n3d_ext(x,y,z),&Out[tx][ty][0],sizeof(float)*(ZZ),&get_reply,0,0,0);
			}
		  }
		  while(get_reply!=(XX*YY));

		  /* 3. compuation */
		  for(i=0;i<(XX*YY);i+=4){
			//load一个X条
			for(tz=0;tz<ZZ+10;tz++){
			  tx=(i+0)/YY;ty=(i+0)%YY;	InTran[tz][0]=In[tx+5][ty+5][tz];
			  tx=(i+1)/YY;ty=(i+1)%YY;	InTran[tz][1]=In[tx+5][ty+5][tz];
			  tx=(i+2)/YY;ty=(i+2)%YY;	InTran[tz][2]=In[tx+5][ty+5][tz];
			  tx=(i+3)/YY;ty=(i+3)%YY;	InTran[tz][3]=In[tx+5][ty+5][tz];
			}
			//更新该条
			for(tz=0;tz<ZZ;tz++){
			  //tx所需数据 0-4行
			  for(n=0;n<10;n++){
				simd_load(v4In[n],&InTran[tz+n][0]);
			  }
			  v4Out=0;
			  //计算tx 0-4
			  for(l=0;l<5;l++){
				v4Out+=StaCoef[4-l]*(v4In[9-l]-v4In[l]);
			  }
			  //解包
			  simd_store(v4Out,&OutTran[tz][0]);
			}
			for(tz=5;tz<ZZ+5;tz++){
			  g_z=par.z_rank*par.DivNz+gz+tz+par.stZ-10;
			  ddz=pmlz_cal(g_z,par.PMLZ,par.mgridnumz,par.Vpmax,par.dh);
			  if((i+0)<(XX*YY)) {
				tx=(i+0)/YY;ty=(i+0)%YY;
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][0])/par.dh);
			  }                                                                                       
			  if((i+1)<(XX*YY)){                                                                      
				tx=(i+1)/YY;ty=(i+1)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][1])/par.dh);
			  }                                                                                       
			  if((i+2)<(XX*YY)) {                                                                     
				tx=(i+2)/YY;ty=(i+2)%YY;	                                                           
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][2])/par.dh);
			  }                                                                                       
			  if((i+3)<(XX*YY)){                                                                      
				tx=(i+3)/YY;ty=(i+3)%YY;                                                              
				Out[tx][ty][tz-5]=1.0f/(1.0f+0.5f*par.dt*ddz)*((1.0f-0.5f*par.dt*ddz)*Out[tx][ty][tz-5]-par.dt*(vel[tx][ty][tz-5]*vel[tx][ty][tz-5])*(OutTran[tz-5][3])/par.dh);
			  }
			}
		  }

		  /* 4. write  Out2 data */
		  put_reply=0;
		  for(tx=0;tx<XX;tx++){
			for(ty=0;ty<YY;ty++){
			  x=par.stX+gx+tx;
			  y=par.stY+gy+ty;
			  z=par.stZ+gz;
			  athread_put(PE_MODE,&Out[tx][ty][0],par.PTzz+n3d_ext(x,y,z),sizeof(float)*(ZZ),&put_reply,0,0);
			}
		  }
		  while(put_reply!=(XX*YY));
		}
	  }
	}
  }
}




